module;
#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
export module XYtcpSocket;

export class TcpSocketClient : public QObject
{
    Q_OBJECT
public:
    explicit TcpSocketClient(QObject *parent = nullptr);
    ~TcpSocketClient();

    // 连接到服务器
    Q_INVOKABLE void connectToServer(const QString &address, quint16 port);
    // 发送数据
    Q_INVOKABLE void sendData(const QByteArray &data);
    // 断开连接
    Q_INVOKABLE void disconnect();

public slots:
    void connectToServerSlot(const QString &address, quint16 port);
    void sendDataSlot(const QByteArray &data);
    void disconnectSlot();

signals:
    void connected();
    void disconnected();
    void dataReceived(const QByteArray &data);

private slots:
    void onReadyRead();
    void onConnected();
    void onDisconnected();

private:
    QTcpSocket *m_socket;
};


export class TcpSocketServer : public QObject
{
    Q_OBJECT
public:
    explicit TcpSocketServer(QObject *parent = nullptr);
    ~TcpSocketServer();
    // 开始监听
    Q_INVOKABLE void startServer(quint16 port);
    // 发送数据到所有客户端
    Q_INVOKABLE void sendDataToAll(const QByteArray &data);
    // 断开所有连接
    Q_INVOKABLE void disconnectAll();

public slots:
    void startServerSlot(quint16 port);
    void sendDataToAllSlot(const QByteArray &data);
    void disconnectAllSlot();

signals:
    void newConnection();
    void disconnected();
    void dataReceived(const QByteArray &data);

private slots:
    void onNewConnection();
    void onReadyRead();
    void onDisconnected();

private:
    QTcpServer *m_server;
    QList<QTcpSocket*> m_clientSockets;
};



// /*
//  * 使用说明
// 客户端类 (TcpSocketClient)
// 连接到服务器：
// 调用 connectToServer 方法连接到指定的服务器地址和端口。
// 使用 sendData 方法发送数据。
// 通过 dataReceived 信号接收服务器发送的数据。
// 断开连接：
// 调用 disconnect 方法断开与服务器的连接。
// 信号：
// connected：当成功连接到服务器时发出。
// disconnected：当与服务器断开连接时发出。
// dataReceived：当从服务器接收到数据时发出。


// 服务器类 (TcpSocketServer)
// 开始监听：
// 调用 startServer 方法开始监听指定的端口。
// 当有新的客户端连接时，会自动处理连接并接收数据。
// 使用 sendDataToAll 方法向所有连接的客户端发送数据。
// 通过 dataReceived 信号接收客户端发送的数据。
// 断开所有连接：
// 调用 disconnectAll 方法断开与所有客户端的连接，并停止监听。
// 信号：
// newConnection：当有新的客户端连接时发出。
// disconnected：当某个客户端断开连接时发出。
// dataReceived：当从某个客户端接收到数据时发出。
// 这两个类分别实现了客户端和服务器的功能，可以根据需要进行扩展和修改。每个类都包含了基本的连接、断开连接、发送和接收数据的功能，并且通过信号和槽机制提供了事件通知。
//  *
//  * /
